這 14 天以來的文章我們可以練習到
同時我們也已經在不知不覺中也用上了 SOLID 的其中幾個原則
只要『正確』的使用工具開發完程式後並加以重構,design pattern 就會自然出現的。
這也是為什麼不從一開始就使用 PHPVCR,如果我們從一開始就使用 PHPVCR 我們會有很高的概率寫出這樣的程式碼
<?php
namespace Recca0120\Ithome30\Tests;
use PHPUnit\Framework\TestCase;
use Recca0120\Ithome30\PttCrawler;
class PttCrawlerTest extends TestCase
{
public function test_fetch_board_page()
{
\VCR\VCR::turnOn();
\VCR\VCR::insertCassette('ptt_home.yaml');
$crawler = new PttCrawler();
$records = $crawler->all();
self::assertEquals([
'name' => 'Gossiping',
"nuser" => '11296',
'class' => '綜合',
'title' => '[八卦] 為國慶賀 抬離訓練編組!',
], $records[0]);
\VCR\VCR::eject();
\VCR\VCR::turnOff();
}
}
<?php
namespace Recca0120\Ithome30;
class PttCrawler
{
public function __construct()
{
}
public function all()
{
$html = file_get_contents('https://www.ptt.cc/bbs/hotboards.html');
return array_map(
fn (string $row) => $this->parseCols($row),
$this->parseRows($html)
);
}
private function parseCols($row)
{
preg_match_all('/"board-(?<name>\w+)">(?<value>.+?)<\/div>/', $row, $matches);
$cols = [];
foreach (array_keys($matches[0]) as $index) {
$name = $matches['name'][$index];
$value = $matches['value'][$index];
$cols[$name] = str_replace('◎', '', strip_tags($value));
}
return $cols;
}
private function parseRows($html)
{
preg_match_all('/<a\sclass="board"[^>]*>.+?<\/a>/s', $html, $matches);
return $matches[0];
}
}
我們光看程式碼來說,結構還是非常不錯的,但立刻違反了單一職責這個原則了。
所以正確的使用方法非常重要,我們必須先理解正確的使用方法後,再去找輔助工具來加速開發,絕對不能因為輔助工具好用就忽略掉正確的使用方法,這點非常重要啊